#ifndef DETECTOR_H
#define DETECTOR_H

#include <opencv2/opencv.hpp>
#include <vector>

class SparkDetector {
public:
    SparkDetector();

    // 检测火光区域
    std::vector<cv::Rect> detect(const cv::Mat& image);

    // 在图像上标注火光区域
    cv::Mat annotateImage(const cv::Mat& image, const std::vector<cv::Rect>& sparkRegions);

private:
    cv::Mat previousFrame;

    cv::Mat preprocessColor(const cv::Mat& image);

    cv::Mat preprocessMotion(const cv::Mat& image);

    // 预处理图像
    cv::Mat preprocessImage(const cv::Mat& image);

    // 后处理检测结果
    std::vector<cv::Rect> postprocessRegions(std::vector<std::vector<cv::Point>>& contours);
};

class PassenerDetector {
public:
    PassenerDetector();

    // 检测人脸区域
    std::vector<cv::Rect> detect(const cv::Mat& image);

    // 在图像上标注人脸区域
    cv::Mat annotateImage(const cv::Mat& image, const std::vector<cv::Rect>& sparkRegions);

    int facesCnt = 0;
    int lostCnt = 0;

private:
    // // 预处理图像
    // cv::Mat preprocessImage(const cv::Mat& image);

    // // 后处理检测结果
    // std::vector<cv::Rect> postprocessRegions(std::vector<std::vector<cv::Point>>& contours);
};

class IntruderDetector {
public:
    IntruderDetector(double lr = 0.01, int thresh = 25, int minArea = 500);

    // 检测入侵者区域
    std::vector<cv::Rect> detect(const cv::Mat& image);

    // 在图像上标注入侵者区域
    cv::Mat annotateImage(const cv::Mat& image, const std::vector<cv::Rect>& sparkRegions);

private:
    cv::Mat background;          // 背景模型
    double learningRate;     // 背景学习率
    int thresholdValue;      // 二值化阈值
    int minContourArea;      // 最小轮廓面积

    // 预处理图像
    cv::Mat preprocessImage(const cv::Mat& image);

    // 后处理检测结果
    std::vector<cv::Rect> postprocessRegions(std::vector<std::vector<cv::Point>>& contours);
};

#endif // DETECTOR_H
